home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / Book Chapters / 03 - Advanced Graphics / Example 1 / sprite.c < prev    next >
Text File  |  1995-02-20  |  3KB  |  131 lines

  1. //
  2. //    File: sprite.c
  3. //
  4. //    This file contains the routines to draw the sprites
  5. //
  6. //    2/19/95 -- Created by Mick
  7. //
  8.  
  9. // include files
  10.  
  11. #include "global.h"
  12.  
  13. #include "sprite.h"
  14.  
  15. // defines for this file
  16.  
  17. // global function declarations
  18.  
  19. tSpriteInfo *loadSprite( signed short inSpriteResID );
  20. void disposeSprite( tSpriteInfo *inSpriteInfo );
  21. void startSpriteDraw( Rect *inClipRect );
  22. void endSpriteDraw( void );
  23. void drawSprite( tSpriteInfo *inSpriteInfo, Point inWhere );
  24.  
  25. // global data owned by this file
  26.  
  27. // local function declarations
  28.  
  29. // static data
  30.  
  31. RgnHandle sOldClipRgn;                                // storage space for the clip region before the startSpriteDraw call
  32.  
  33. // functions
  34.  
  35.  
  36. //
  37. //    loadSprite -
  38. //
  39. //    Loads/allocates all the data for a sprite.
  40. //
  41.  
  42. tSpriteInfo *loadSprite( signed short inSpriteResID )
  43. {
  44.     tSpriteInfo *newSprite;            // the new sprite data
  45.     
  46.     // create the sprite info record
  47.     newSprite = ( tSpriteInfo * )NewPtr( sizeof( tSpriteInfo ) );
  48.     
  49.     // load the pict
  50.     newSprite->fSpritePict = GetPicture( inSpriteResID );
  51.     if ( newSprite->fSpritePict == ( PicHandle )kNil )
  52.         {
  53.             // if it did not load, drop into the debugger -- real programs would have error checking
  54.             Debugger();
  55.         }
  56.     
  57.     // copy its bounds rect
  58.     newSprite->fSpriteRect = ( *( newSprite->fSpritePict ) )->picFrame;
  59.     
  60.     // return the new sprite!
  61.     return newSprite;
  62. }
  63.  
  64.  
  65. //
  66. //    disposeSprite -
  67. //
  68. //    Disposes/releases all the memory used in a sprite
  69. //
  70.  
  71. void disposeSprite( tSpriteInfo *inSpriteInfo )
  72. {
  73.     // dump the picture
  74.     ReleaseResource( ( Handle )( inSpriteInfo->fSpritePict ) );
  75.     
  76.     // free the structure
  77.     DisposePtr( ( Ptr )inSpriteInfo );
  78. }
  79.  
  80.  
  81. //
  82. //    startSpriteDraw -
  83. //
  84. //    Prepare the sprite draw. Assumes that the port is set to the destination port.
  85. //
  86.  
  87. void startSpriteDraw( Rect *inClipRect )
  88. {
  89.     // save the current port's clip region
  90.     sOldClipRgn = NewRgn();
  91.     GetClip( sOldClipRgn );
  92.     
  93.     // set the clip region to be the passed in rect
  94.     ClipRect( inClipRect );
  95. }
  96.  
  97.  
  98. //
  99. //    endSpriteDraw -
  100. //
  101. //    End the sprite draw sequence.
  102. //
  103.  
  104. void endSpriteDraw( void )
  105. {
  106.     // restore the old clip region
  107.     SetClip( sOldClipRgn );
  108.     
  109.     // dump the region
  110.     DisposeRgn( sOldClipRgn );
  111. }
  112.  
  113.  
  114. //
  115. //    drawSprite -
  116. //
  117. //    Draw the sprite in the port.
  118. //
  119.  
  120. void drawSprite( tSpriteInfo *inSpriteInfo, Point inWhere )
  121. {
  122.     Rect destRect;        // where we want to draw the sprite
  123.     
  124.     // calculate the destination rect
  125.     destRect = inSpriteInfo->fSpriteRect;
  126.     OffsetRect( &destRect, inWhere.h, inWhere.v );
  127.     
  128.     // draw the sprite
  129.     DrawPicture( inSpriteInfo->fSpritePict, &destRect );
  130. }
  131.